// 引入模块
import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 引入接口token续签
import { updatetokenAPI } from '../api/user'
// 引入二次封装的axios

// 创建axios实例,返回一个实例,本质还是axios 这样的好处是可以根据不同的需求,封装的不同请求, 灵活
const request = axios.create({
  baseURL: 'http://toutiao.itheima.net'
})
// 添加请求拦截器,
request.interceptors.request.use(config => {
  if (store.state.token) {
    config.headers.Authorization = `Bearer ${store.state.token}`
  } else {
    config.headers.Authorization = `Bearer ${store.state.refreshToken}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

// 添加响应拦截器,可以对返回的数据或者错误(token过去)作统一处理
request.interceptors.response.use((resp) => {
  // 成功后的回调
  return resp.data
}, async (err) => {
  // console.dir(err)
  // 如果 refresh_tokem 也失效 清空token跳转登录页
  if (err.response.data.message === 'refresh_token失效') {
    // 清空token
    store.commit('settoken', '')
    store.commit('refreshToken', '')
    // console.log('跳转登录页')
    // 跳转到登录页面
    router.replace({
      path: '/login?from=' + router.currentRoute.path
    })
  }

  // 401就是一个典型的失败,表示token过期或者无效
  // token过去的两种解决方法
  // 1.重新登陆
  // 2.touken续签
  if (err.response.status === 401) {
    // 1. 清空vuex中的token
    store.commit('settoken', '')

    // 2. 调用接口获取续签后的新token
    const res = await updatetokenAPI()

    // console.log('续签token', res)

    // 3. 更新vuex中的touken
    store.commit('settoken', res.data.token)

    // config中记录了上次未完成的请求参数信息,比如method,url,data,把结果return到组件await的地方
    // 4. 继续完成上次未完成的操作
    return request(err.config)
    // 跳转到登录页面
    // router.replace({
    //   path: '/login?from=' + router.currentRoute.path
    // })
  }
  // 失败后的回调
  return Promise.reject(err)
})

// export default request

// 实验
export default ({ method, url, headers, params, data }) => {
  return request({
    method: method,
    url,
    headers,
    params,
    data
  })
}
